/***************************************
定义小车全局参数
包含：色块识别，二维码识别消息结构体
***************************************/
#ifndef _CONFIG_H
#define _CONFIG_H

typedef struct JUDGE_CAR{
  bool calibrate_car_flag = false;
  String send_commond_msg = "";
  int x1 = 0;
  int y1 = 0;
  int x2 = 0;
  int y2 = 0;
  bool isnot_find_line = false;
  int start_judge_once = 0;
  float line_slope = 0;
  int line_position = 0;
  bool input_angle_judge = false;
  int input_angle_judge_success_count = 0;
  bool input_position_judge = false;
  int input_position_judge_success_count = 0;

  bool input_circle_judge = false;
  bool circle_width  = false;
  bool circle_height = false;
  int center_x = 0;
  int center_y = 0;
};

typedef struct QR_MSG{
  bool qr_detection_loop = true;      //用于二维码检测外部循环标志
  bool recv_qr_msg_start = false;     //用于发送二维码检测开始标志
  bool recv_qr_msg_success = false;   //用于发送二维码检测完成标志
  String send_commond_msg = "";       //用于定义二维码开始和结束时发送的数据
  int qr_x_pos = 0;                   //用于存储读取到的二维码的x坐标
  int qr_y_pos = 0;                   //用于存储读取到的二维码的y坐标
  int qr_w_pos = 0;                   //用于存储读取到的二维码的宽度值
  int qr_h_pos = 0;                   //用于存储读取到的二维码的高度值
  String qr_data = "";                //用于存储读取到的二维码的信息值
};

typedef struct COLOR_MSG{
  bool color_detection_loop = true;   //用于颜色检测外部循环标志
  bool recv_color_msg_success = false;//用于发送颜色检测完成标志
  bool recv_color_msg_start = false;  //用于发送颜色检测开始标志
  String send_commond_msg = "";       //用于定义颜色开始和结束时发送的数据
  int color_x_pos = 0;                //用于存储读取到的颜色的x坐标
  int color_y_pos = 0;                //用于存储读取到的颜色的y坐标
  int color_w_pos = 0;                //用于存储读取到的颜色的宽度值
  int color_h_pos = 0;                //用于存储读取到的颜色的高度值
  String color_data = "";             //用于存储读取到的颜色的信息值
};

typedef struct COLOR_RING_MSG{
  bool colorring_detection_loop = true;   //用于色环检测外部循环标志
  bool recv_colorring_msg_success = false;//用于发送色环检测完成标志
  bool recv_colorring_msg_start = false;  //用于发送色环检测开始标志
  String send_commond_msg = "";           //用于定义色环开始和结束时发送的数据
  int colorring_x_pos = 0;                //用于存储读取到的色环的x坐标
  int colorring_y_pos = 0;                //用于存储读取到的色环的y坐标
  int colorring_w_pos = 0;                //用于存储读取到的色环的宽度值
  int colorring_h_pos = 0;                //用于存储读取到的色环的高度值
  String colorring_data = "";             //用于存储读取到的色环的信息值
};

typedef struct DETECT_MSG{
  int detection_color_sum_num = 0;    //用于存储检测颜色次数的变量
  int RED_COLOR = 1;                  //定义检测到的颜色对应值，检测到红色对应1
  int GREEN_COLOR = 2;                //定义检测到的颜色对应值，检测到绿色对应2
  int BLUE_COLOR = 3;                 //定义检测到的颜色对应值，检测到蓝色对应3
  String qr_complete_data = "";       //用于存储检测到的二维码完整字符串值，例如：“123+321”
  int before_the_plus_data = 0;       //用于存储二维码信息中加号之前的int类型数据，例如： 123
  int after_the_plus_data = 0;        //用于存储二维码信息中加号之后的int类型数据，例如： 321
  int recv_current_color = 0;         //用于检测颜色时，记录实时检测到的颜色当前值
  int recv_color_one = 0;             //用于存储第一次检测到的颜色值，红色对应1，绿色对应2，蓝色对应3
  int recv_color_two = 0;             //用于存储第二次检测到的颜色值，红色对应1，绿色对应2，蓝色对应3
  int recv_color_three = 0;           //用于存储第三次检测到的颜色值，红色对应1，绿色对应2，蓝色对应3
  int detection_colorring_sum_num = 0;//用于存储检测色环次数的变量
  int receive_current_colorring = 0;  //用于存储色环检测时，存储当前检测到的色环颜色
  int recv_colorring_one = 0;         //用于存储第一次检测到的色环值，红色对应1，绿色对应2，蓝色对应3
  int recv_colorring_two = 0;         //用于存储第二次检测到的色环值，红色对应1，绿色对应2，蓝色对应3
  int recv_colorring_three = 0;       //用于存储第三次检测到的色环值，红色对应1，绿色对应2，蓝色对应3
  int recv_colorring_four = 0;        //用于存储第四次检测到的色环值，红色对应1，绿色对应2，蓝色对应3
  int recv_colorring_five = 0;        //用于存储第五次检测到的色环值，红色对应1，绿色对应2，蓝色对应3
  int recv_colorring_six = 0;         //用于存储第六次检测到的色环值，红色对应1，绿色对应2，蓝色对应3
  int qr_code_capture_sequence_one = 0;  //二维码抓取第一个物料颜色代号
  int qr_code_capture_sequence_two = 0;  //二维码抓取第二个物料颜色代号
  int qr_code_capture_sequence_three = 0;//二维码抓取第三个物料颜色代号
  int qr_code_placement_order_one = 0;   //二维码放置第一个物料颜色代号
  int qr_code_placement_order_two = 0;   //二维码放置第二个物料颜色代号
  int qr_code_placement_order_three = 0; //二维码放置第三个物料颜色代号
  bool catch_material_flag = false;
};

//小车整体流程全局参数
typedef struct CAR_GLOBAL_PARAMETERS{
  //constexpr 声明的变量或函数在编译时就可以被求值。这意味着编译器可以在编译阶段就确定其值，而不是在运行时计算。
  //constexpr 可以用于基本数据类型（如 int, float, double 等），以及一些用户定义的类型，只要这些类型满足编译时常量的要求。
  //switch 语句中的 case 标签要求是编译时常量，因为编译器需要在编译时就知道每个 case 的值，以便生成高效的跳转表。
  //使用 constexpr 定义的常量满足这一要求，因为它们在编译时就已经确定了值。
  static constexpr int forward = 1;
  static constexpr int back = 2;
  static constexpr int turnleft = 3;
  static constexpr int turnright = 4;
  static constexpr int transleft = 5;
  static constexpr int transright = 6;
  static constexpr int stop = 7;
  int car_action_delay_time = 1000; //小车执行完一个动作后，程序需要等待的时间，单位：毫秒
  float car_departure_area_backward_distance  = 0.185; //小车从出发区域开始需要后退的距离。单位：米
  float car_move_to_qrcode_area_distance = 0.65; //小车向左平移到二维码区域需要运动的距离。单位：米
  float car_move_to_codedisk_area_distance = 0.775; //小车从二维码区域向左平移到码盘区域需要的距离。单位：米
  float car_codedisk_area_adjust_position = 0.1;   //小车微调，使小车能够更靠近码盘区域，单位：米
  float lift_move_up_distance = 170;   //升降模块向上抬升170毫米
  float lift_move_down_distance = -100;//升降模块向下下降115毫米
};

class serial_module{

};

#endif
